#-*- codeing = utf-8 -*-
#@Time : 2020/11/24 20:08
#@Author : 阳某
#@File : 06.字符编码.py
#@Software : PyCharm


# Python语言要对字符串对象 进行存储和传输的时候，通常要使用字符串的encode方法，参数指定编码方式，编码为一个 bytes 对象。
# bytes对象的底层就是用一个个的字节来存储字符串中的文字的。
# 同样的字符串，用不同的编码方式，有时会产生不同的bytes结果。
print ('你好'.encode('utf8')) # 输出 b'\xe4\xbd\xa0\xe5\xa5\xbd'
print ('你好'.encode('gbk'))  # 输出 b'\xc4\xe3\xba\xc3'
# 输出内容 中 b 开头，表示这是一个 字节串bytes 对象
# \x 说明是用16进制表示一个字节
# 你好 两个字，使用 utf8 编码 后的字节串，用16进制来表示 就是6个字节 e4bda0 e5a5bd
# 你好 两个字，使用 gbk 编码 后的字节串，用16进制来表示 却是4个字节 c4e3 bac3


# encode方法返回的是编码后的字节串对象bytes 编码为字节串对象 bytes 就可存储到文件或者传输到网络中去了。 我们后面的学习会讲如何进行文件存储和网络传输
# 字节串解码
# 当我们的Python程序从文件中读入文字信息， 从网络上接收 文字信息，获取的数据通常是使用某种字符编码后的 字节串。
# 程序通常需要解码这些 字节串 为 字符串 ，这样才方便程序 理解和处理 字符信息。
# Python语言的解码 都是解码成 unicode字符串对象
# 要解码字节串，必须要知道这个字节串是用什么字符编码的方式进行编码的。
# 如果知道了，就可以用字节串对象的decode方法 进行解码，参数指定了编码方式
print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf8'))
print(b'\xc4\xe3\xba\xc3'.decode('gbk'))

'''
一些字符编解码技巧
unicode数字转换为字符
把 unicode数字转换为字符， 使用函数 chr() , 比如：

>>> chr(50)
'2'
>>> chr(20013)
'中'
>>> chr(0x4e2d)  # 0x开头表示数字是16进制
'中'
字符转换为unicode数字
反过来，要把 字符转换为对应的unicode数字，使用函数 ord()

该函数参数字符串里面只能有一个字符

>>> ord('2')
50
>>> ord('中')
20013
字符串编码为 unicode转义数字
除了utf8，gbk 还有一种常见的编码方式，叫做 unicode-escape ，就是直接用unicode数字字符串表示字符，如下所示

>>> '白月黑羽'.encode('unicode-escape')
b'\\u767d\\u6708\\u9ed1\\u7fbd'
用unicode转义数字 写字符串
>>> '\u767d\u6708\u9ed1\u7fbd'
'白月黑羽'
直接用16进制数字创建 bytes
>>> b'\xb0\xd7\xd4\xc2\xba\xda\xd3\xf0'
b'\xb0\xd7\xd4\xc2\xba\xda\xd3\xf0'

>>> b'\xb0\xd7\xd4\xc2\xba\xda\xd3\xf0'.decode('gbk')
'白月黑羽'
字节串 和 16进制表示字节的字符串
>>> a = b'hello,123'
>>> a.hex()
'68656c6c6f2c313233'
反向操作，把 16进制表示字节的字符串 转化为 字节串就是

>>> bytes.fromhex('68656c6c6f2c313233')
b'hello,123'
'''